#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
从 ros-pkg.list 文件生成 VCS 格式的 repos.yaml 文件
URL 格式为 https://gitee.com/agiros/仓库名称.git
版本可通过参数配置，默认为 master
支持从 repo_urls.csv 读取仓库列表生成部分仓库的 repos.yaml
"""

import os
import yaml
import argparse
import csv
from pathlib import Path

def read_repo_names_from_csv(csv_file):
    """
    从 CSV 文件中读取仓库名称列表
    
    Args:
        csv_file: CSV 文件路径
    Returns:
        仓库名称列表
    """
    repo_names = []
    try:
        with open(csv_file, 'r', encoding='utf-8') as f:
            csv_reader = csv.reader(f)
            next(csv_reader)  # 跳过标题行
            for row in csv_reader:
                if row:  # 确保行不为空
                    repo_names.append(row[0])  # 第一列是仓库名
        return repo_names
    except Exception as e:
        print(f"读取 CSV 文件时出错: {e}")
        return []

def generate_repos_file(pkg_list_file, output_file, version='master', repo_filter=None):
    """
    从包列表文件生成 repos.yaml 文件
    
    Args:
        pkg_list_file: 包含仓库名称的文件路径
        output_file: 输出的 repos.yaml 文件路径
        version: Git 仓库版本（分支、标签或提交ID），默认为 master
        repo_filter: 仓库名称列表，用于过滤仓库，如果为 None 则包含所有仓库
    """
    # 读取包列表文件
    repos_dict = {}
    
    try:
        with open(pkg_list_file, 'r', encoding='utf-8') as f:
            for line in f:
                # 跳过空行
                if not line.strip():
                    continue
                    
                # 每行格式为: 仓库名 仓库名
                parts = line.strip().split()
                if len(parts) >= 1:
                    repo_name = parts[0]
                    # 如果指定了仓库过滤列表，则只处理列表中的仓库
                    if repo_filter is None or repo_name in repo_filter:
                        # 创建仓库配置
                        repos_dict[repo_name] = {
                            'type': 'git',
                            'url': f'https://gitee.com/agiros/{repo_name}.git',
                            'version': version
                        }
    except Exception as e:
        print(f"读取包列表文件时出错: {e}")
        return False
    
    # 创建输出目录（如果不存在）
    output_path = Path(output_file)
    output_path.parent.mkdir(parents=True, exist_ok=True)
    
    # 根据版本信息修改输出文件名
    output_dir = output_path.parent
    output_filename = f"repos_partial_{version}.yaml" if repo_filter else f"repos_{version}.yaml"
    final_output_path = output_dir / output_filename
    
    # 写入 repos.yaml 文件
    try:
        with open(final_output_path, 'w', encoding='utf-8') as f:
            # 添加顶层 repositories 键
            repos_yaml = {'repositories': repos_dict}
            yaml.dump(repos_yaml, f, default_flow_style=False, sort_keys=False)
        print(f"成功生成 repos 文件: {final_output_path}")
        print(f"共包含 {len(repos_dict)} 个仓库")
        print(f"所有仓库版本设置为: {version}")
        return True
    except Exception as e:
        print(f"写入 repos 文件时出错: {e}")
        return False

def main():
    parser = argparse.ArgumentParser(description='从 ros-pkg.list 生成 repos.yaml 文件')
    parser.add_argument('--input', '-i', default='/root/ws/2025/04/agiros_pkg_build_tools/build_tools/output/ros-pkg.list',
                        help='输入的包列表文件路径')
    parser.add_argument('--output', '-o', default='/root/ws/2025/04/agiros_pkg_build_tools/repos.yaml',
                        help='输出的 repos.yaml 文件路径')
    parser.add_argument('--version', '-v', default='master',
                        help='Git 仓库版本（分支、标签或提交ID），默认为 master')
    parser.add_argument('--repo-csv', '-r', default='/root/ws/2025/04/agiros_pkg_build_tools/repo_urls.csv',
                        help='包含仓库名称的 CSV 文件路径，用于生成部分仓库的 repos.yaml')
    parser.add_argument('--partial', '-p', action='store_true',
                        help='是否只生成 CSV 文件中指定的仓库')
    
    args = parser.parse_args()
    
    # 检查输入文件是否存在
    if not os.path.exists(args.input):
        print(f"错误: 输入文件 {args.input} 不存在")
        return 1
        
    # 如果指定了 partial 模式，读取 CSV 文件中的仓库列表
    repo_filter = None
    if args.partial:
        if not os.path.exists(args.repo_csv):
            print(f"错误: CSV 文件 {args.repo_csv} 不存在")
            return 1
        repo_filter = read_repo_names_from_csv(args.repo_csv)
        if not repo_filter:
            print("错误: 未能从 CSV 文件中读取到仓库名称")
            return 1
    
    # 生成 repos 文件
    if generate_repos_file(args.input, args.output, args.version, repo_filter):
        return 0
    else:
        return 1
# ./generate_repos.py -v master
# ./generate_repos.py -v openEuler2403lts
# ./generate_repos.py -v ubuntu2204lts
#./generate_repos.py --partial -v master
#./generate_repos.py --partial -v openEuler2403lts
if __name__ == "__main__":
    exit(main())